package pe.edu.upc.dew.bibliotecaweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import pe.edu.upc.dew.bibliotecaweb.model.Libro;
import pe.edu.upc.dew.bibliotecaweb.model.Persona;
import pe.edu.upc.dew.bibliotecaweb.model.Reserva;

/**
 * @author DEW 2010
 * Clase ReservaDao encargada de comunicarse y realizar las consultas a la base de datos (Reserva)
 */
public class ReservaDao {

    /**
     * Método que se encarga de grabar en la base de datos la reserva realizada
     * @param reservaLibro  Recibe un objeto Reserva con toda la información necesaria para hacer el registro en la base de datos
     */
    public void realizarReserva(Reserva reservaLibro) {
        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            st.execute("INSERT INTO RESERVA (FECHAEJECUTARESERVA, FECHARESERVA, ESTADORESERVA,IDLIBRO, IDPERSONA) VALUES ('" +
                    reservaLibro.getFechaEjecutaReserva() + "','" + reservaLibro.getFechaReserva() + "','" + reservaLibro.getEstadoReserva() + "'," +
                    reservaLibro.getLibro().getIdLibro() + "," + reservaLibro.getPersona().getIdPersona() + ")");
            System.out.println("SE INGRESO LA RESERVA CORRECTAMENTE");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }

    /**
     * Método que se encarga de actualizar los estados de las reservas ya vencidas, tomando como base la fecha actual
     */
    public void actualizaEstadoReserva() {
        Connection cnt = null;
        PreparedStatement pst = null;
        try {
            cnt = ConnectionUtils.getConnection();
            pst = cnt.prepareStatement("UPDATE RESERVA SET ESTADORESERVA = 'N' WHERE FECHARESERVA < CURRENT_DATE");
            pst.executeUpdate();
            System.out.println("SE ACTUALIZARON LOS ESTADOS RESERVA");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closePreparedStatement(pst);
            ConnectionUtils.closeConnection(cnt);
        }
    }

    /**
     * Obtiene las reserva activas del usuario ingresado
     * @param username Cadena que contiene el nombre del usuario ingresado en la búsqueda de reservas, desde la página de préstamos
     * @return Retorna un bean Reserva con toda la información de la reserva activa que se pueda haber encontrado al usuario ingresado.
     * En caso no encontrara reservas activas, retorna el objeto como null
     */
    public Reserva getReservaPorUsuario(String username) {
        Reserva reserva = null;
        Connection cnt = null;
        Statement st = null;
        ResultSet rs = null;
        Libro libro = null;
        Persona persona = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            rs = st.executeQuery("SELECT * FROM RESERVA R INNER JOIN PERSONA P ON R.IDPERSONA = P.IDPERSONA INNER JOIN LIBRO L ON " +
                    "R.IDLIBRO = L.IDLIBRO WHERE R.ESTADORESERVA = 'A' AND USUARIOPERSONA ='" + username + "'");
            if (rs.next()) {
                reserva = new Reserva();
                reserva.setIdReserva(rs.getInt("IDRESERVA"));
                reserva.setFechaReserva(rs.getString("FECHARESERVA"));
                reserva.setFechaEjecutaReserva(rs.getString("FECHAEJECUTARESERVA"));
                libro = new Libro();
                libro.setTituloLibro(rs.getString("TITULOLIBRO"));
                libro.setTemaLibro(rs.getString("TEMALIBRO"));
                libro.setCodigoIsbn(rs.getString("CODIGOISBN"));
                libro.setNombreEditorial(rs.getString("NOMBREEDITORIAL"));
                libro.setNombreAutor(rs.getString("NOMBREAUTOR"));
                libro.setAnioPublicacion(rs.getString("ANIOPUBLICACION"));
                libro.setIdLibro(rs.getInt("IDLIBRO"));
                reserva.setLibro(libro);
                persona = new Persona();
                persona.setNombrePersona(rs.getString("NOMBREPERSONA"));
                reserva.setPersona(persona);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
        return reserva;
    }

    /**
     * Método que actualiza el estado de las reservas a 'E' (Reserva Ejecutada)
     * @param idReserva Cadena que contiene el id de la reserva a modificar
     */
    public void actualizaEstadoReserva(int idReserva) {
        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            st.execute("UPDATE RESERVA SET ESTADORESERVA='E' WHERE IDRESERVA = " + idReserva);
            System.out.println("SE ACTUALIZO EL ESTADO DE LA RESERVA  CORRECTAMENTE");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }
}
